package com.fengxu.nio;

import javax.swing.filechooser.FileSystemView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

// NIO通道测试-写入/读取/复制 文件
public class NIOFileChannel01 {

    private final static String desktop = FileSystemView.getFileSystemView().getHomeDirectory().getAbsolutePath();

    public static void main(String[] args) throws Exception {
//        read();
//        write();
        copyFile();

    }

    // 读出数据
    public static void read() throws Exception{
        // 获取resources目录下的1.txt
        FileInputStream is = new FileInputStream(NIOFileChannel01.class.getResource("/1.txt").getFile());
        // 获取文件通道
        FileChannel fileChannel = is.getChannel();
        // 获取ByteBuffer
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        // 将通道中的数据读取到buffer中
        fileChannel.read(byteBuffer);
        // 读出buffer中的数据
        System.out.println(new String(byteBuffer.array()));
    }

    // 写入数据
    public static void write() throws Exception{
        // 创建一个文件输出流
        FileOutputStream fos = new FileOutputStream(desktop+"/1.txt");

        // 获取通道（fileChannel真实类型为FileChannelImpl）
        FileChannel fileChannel = fos.getChannel();

        // 创建一个ByteBuffer
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

        // 将值输入到buffer中
        byteBuffer.put("Hello World!".getBytes());

        byteBuffer.flip();
        // 将buffer中的内容写入到通道中
        fileChannel.write(byteBuffer);

        fos.close();
    }

    // 使用NIO赋值文件
    public static void copyFile() throws Exception{
        // 得到resources资源目录下的1.txt文件对象
        File file = new File(NIOFileChannel01.class.getResource("/1.txt").getFile());
        // 获取输入流
        FileInputStream fis = new FileInputStream(file);
        // 得到要输出到的桌面上的2.txt输出流
        FileOutputStream fos = new FileOutputStream(desktop+"/2.txt");
        // 获取输入流的通道
        FileChannel fileChannel = fis.getChannel();
        // 将输入流通道中的数据转换到输出流的通道中
        fileChannel.transferTo(0,file.length(),fos.getChannel());
        // 关闭流
        fis.close();
        fos.close();
    }
}
